<?php
namespace wxCrypt;

/**
 * 提供提取消息格式中的密文及生成回复消息格式的接口.
 */
class XMLParse
{
	/**
	 * 提取出xml数据包中的加密消息
	 * @param string $xmltext 待提取的xml字符串
	 * @return string 提取出的加密消息字符串
	 */
	public function extract($xmltext)
	{
		// 预定义返回数据
		$res = [
			'status' => ErrorCode::$ParseXmlError,
			'data' => null
		];

		// 版本兼容性处理，PHP8+已自行处理XML实体攻击，不调用废除的函数
		$php_version = substr(PHP_VERSION, 0, 1);
		if($php_version < 8)
		{
			libxml_disable_entity_loader(true);
		}

		try
		{
			// 从字符串构建xml对象
			$xml = new \DOMDocument();
			$xml->loadXML($xmltext);
			// 获取除根节点之外的数据（保存为数组）
			$node_list = $xml->getElementsByTagName('*');
			$xml_data = [];
			foreach($node_list as $key=>$val)
			{
				$node_name = $val->nodeName;
				if($node_name == 'xml')
				{
					continue;
				}
				$xml_data[$node_name] = $val->nodeValue;
			}
			$res = [
				'status' => ErrorCode::$OK,
				'data' => $xml_data
			];
			return $res;
		}
		catch (Exception $e)
		{
			return $res;
		}
	}


	/**
	 * 生成xml消息
	 * @param string $encrypt 加密后的消息密文
	 * @param string $signature 安全签名
	 * @param string $timestamp 时间戳
	 * @param string $nonce 随机字符串
	 */
	public function generate($encrypt, $signature, $timestamp, $nonce)
	{
		$format = "<xml>
<Encrypt><![CDATA[%s]]></Encrypt>
<MsgSignature><![CDATA[%s]]></MsgSignature>
<TimeStamp>%s</TimeStamp>
<Nonce><![CDATA[%s]]></Nonce>
</xml>";
		return sprintf($format, $encrypt, $signature, $timestamp, $nonce);
	}


}
